<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // js弱类型的语言
        //   数字(浮点型float,整型int)
        //   分号
        //   {}  代码块 
        //   预编译  
        //   undefined



        // 函数
        //    形参和实参  arguments
        //    返回值  return 
        //       return false 阻止默认事件  e.preventDefault()
        //    作用域 --- 全局变量和局部变量
        //    函数的几种形式
        //       具名函数     
        //       赋值式函数      推荐使用    没有预编译
        //       匿名函数
        //       事件处理函数 --- 只有一个参数 e

        //    递归函数 --- 自己调用自己 

        //    回调函数 --- 把函数当做参数  ---  主要是为了解决异步的问题

        


        // 预编译

        // 数组
        //    方法  includes()  indexOf()  push()  concat()  slice()  splice()   join()
        //    迭代方法  forEach()  map()  filter()  some()  every()  sort()


        // 字符串
        //   charAt()   charCodeAt()   String.fromCharCode()
        //   includes()  indexOf()  concat()  slice()   substr()  substring()  replace()  split()

        //   正则表达式  replace()   search()   split(/ +/)   match(//g)

        // 对象
        //    Object
        //    键值对   属性:属性值  (键名:键值)
        //    for in 
        //    对象的访问   .和[]
        

        // DOM 
        //   节点  prev   next   parent  children   qs
        //   宽高的操作
        //       clientWidth   里面
        //       offsetWidth   外面 
        //       offsetLeft    最近的具有定位的祖先元素
        //       scrollWidth   实际宽度
        //   坐标   e.clientX(e.x)  e.pageX   e.offsetX(目标源)    pointer-events:none ;


        // 事件
        //    事件机制  --- 冒泡和捕获
        //    事件对象 e 
        //    阻止事件冒泡
        //    事件代理 --- 委托
        //    事件监听 --- 不会覆盖


        // 伪数组？？？


        // if(false) {} ;
        // switch() {}
        // for(var i = 0 i < 10 i++){}


        // {
        //     alert(666);
        // }


        // {
        //     var a = 3 ;
        // }

        // console.log(a);


        // var a = 'hi' ;

        // var b = new String('hi') ;




        function code() {
            var res = '' ;
            for(var i = 0 ; i < 4 ; i++) {
                var n = rand(0 , arr.length) ;
                res += arr[n] ;
            }

            // 判断是否有数字
            // 判断是否有小写
            // 判断是否有大写

            // 三者都有  return res 
            // 否则  return code()

            

        }

        // code() ;
        // alert(666) ;


        function fn(cb) {
            setTimeout(function(){
                console.log(888);
                // console.log(666);
                cb(6) ;
            },1000)

           
        }

        fn(function(a) {
            console.log(a);
        }) ;

       



        // function deepCopy(arr) {
        //     var newArr = [] ;

        //     // 遍历原数组
        //     for(var i in arr) {
        //         // 判断是不是数组
        //         if(Array.isArray(arr[i])) {
        //             var newArr2 = deepCopy(arr[i]) ;
        //             newArr.push(newArr2) ;
        //         } else {
        //             newArr.push(arr[i])
        //         }
        //     }

        //     return newArr ;
        // }


        // [1,[2,3],4]



        function foo() {
            console.log(5);
            return function() {
                console.log(7);
            }
        }


        // var res = foo() ;
        // res() ;
        foo()() ;

    </script>
    
</body>
</html>